﻿package com.medsys.dao;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;

import com.medsys.model.Consulta;

/**
 * Classe para acesso a base de dados da classe {@link Consulta}.
 * @author Felipe Lauksas
 *
 */
public class ConsultaDAO extends BaseDAO {
	/**
	 * Construtor passando a sess�o j� criada. 
	 * @param session criada por {@link DAOFactory}.
	 */
	public ConsultaDAO(Session session) {
		super(session);		
	}		
	/**
	 * M�todo salva um objeto {@link Consulta} no banco de dados.
	 * @param consulta do tipo {@link Consulta}.
	 * @return {@link Consulta} persistido.
	 * @throws Exception
	 */
	public Consulta salvar (Consulta consulta) throws Exception{
		try {
			consulta = (Consulta) this.session.merge(consulta);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return consulta;
	}
	/**
	 * M�todo alterar um objeto {@link Consulta} no banco de dados.
	 * @param consulta do tipo {@link Consulta}.
	 * @throws Exception
	 */
	public void alterar(Consulta consulta) throws Exception{
		try {
			this.session.update(consulta);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
	}
	/**
	 * M�todo para listar todos os objetos {@link Consulta} que est�o no banco de dados.
	 * @return {@link List} com objetos {@link Consulta}.
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public List<Consulta> listarTodos() throws Exception{
		List<Consulta> listConsultas = null;
		try {
			listConsultas = this.session.createCriteria(Consulta.class).list();
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return listConsultas;
	}	

	public Consulta recupararConsultaEReceituarios(Serializable id) throws Exception{
	    Consulta consulta = null;
		try {
			
			Query query = this.session.createQuery("select c from Consulta c join fetch c.receituarios where c.idConsulta = "+id);
			
			consulta = (Consulta) query.uniqueResult();
			
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return consulta;
	}

	
	/**
     * Pesquisa um consulta pela sua chave
     * @param Integer id
     * @return {@link Consulta} consulta
     */
    public Consulta pesquisarPorId(Serializable id)throws Exception{ 
    	
    	Consulta consulta = null;
    	
    	try{
    		
    		consulta = (Consulta) this.session.get(Consulta.class, id);
    		
    	}catch (HibernateException e) {		
    		
			throw new Exception(e);
		}
    	return consulta;
    }
    /**
     * Pesquisa um consulta pelo periodo
     * @param Integer id
     * @return {@link Consulta} consulta
     */
    @SuppressWarnings("unchecked")
	public List<Consulta> pesquisarPorPeriodo(Date inicioPeriodo, Date fimPeriodo)throws Exception{ 
    	
    	List<Consulta> consultasPorPeriodo = null;
    	
    	try{
    		
    		StringBuilder sql = new StringBuilder();
        	sql.append("select c from Consulta c \n");
        	sql.append("where data between ? and ?");
        	
        	Query query = this.session.createQuery(sql.toString());
        	query.setDate(0, inicioPeriodo);
        	query.setDate(1, fimPeriodo);
        	
        	consultasPorPeriodo = query.list();
    		
    	}catch (HibernateException e) {		
    		
			throw new Exception(e);
		}   	
    	  
    	return consultasPorPeriodo;
        
    }
}
